package com.wn.framework.utils

import android.content.Context
import android.graphics.Typeface
import android.graphics.drawable.GradientDrawable
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
import androidx.databinding.BindingAdapter
import com.blankj.utilcode.util.ConvertUtils
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.wn.framework.R
import com.wn.framework.manager.ActivityManager
import java.io.File
import java.text.SimpleDateFormat
import java.util.*

/**
 * @Author: wn
 * @Date: 2024/11/4 17:07
 * @Description: 项目适配用的 BindAdapter -- DataBinding 扩展支持
 * @BindingAdapter("app:srcCompat", requireAll = false) 对应 xml 中 app:srcCompat 属性
 * 第一个参数是默认传递的 控件
 * xml 绑定的 数据 改变 就会触发 函数
 */

/**
 * app:srcCompat DataBinding扩展
 * requireAll 默认 true 必须用到全部形参
 * @param imageView ImageView  支持图片加载 绑定
 * @param src Any?
 */
@BindingAdapter("app:srcCompat", requireAll = false)
fun imgSrcCompat(imageView: ImageView, src: Any?) {
  // 如果 该 控件已经销毁 直接返回
  if (ActivityManager.isActivityDestroy(imageView.context)) return

  val imgRes = src ?: R.mipmap.default_img

  Glide.with(imageView)
    .load(imgRes)
    .placeholder(R.mipmap.default_img) // 占位符，异常时显示的图片
    .error(R.mipmap.default_img) // 错误时显示的图片
    .skipMemoryCache(false) // 启用内存缓存
    .diskCacheStrategy(DiskCacheStrategy.RESOURCE) // 磁盘缓存策略
    .into(imageView)
}

/**
 * app:headSrc DataBinding扩展 -- 通过 File 设置头像
 * requireAll 默认 true 必须用到全部形参
 * @param imageView ImageView  支持图片加载 绑定
 * @param src Any?
 */
@BindingAdapter("app:srcHead", requireAll = false)
fun imgSrcHead(imageView: ImageView, src: String?) {
  // 如果 该 控件已经销毁 直接返回
  if (ActivityManager.isActivityDestroy(imageView.context)) return

  val file = File(src ?: "")

  Glide.with(imageView)
    .load(file)
    .placeholder(R.mipmap.default_head) // 占位符，异常时显示的图片
    .error(R.mipmap.default_head) // 错误时显示的图片
    .skipMemoryCache(false) // 启用内存缓存
    .diskCacheStrategy(DiskCacheStrategy.RESOURCE) // 磁盘缓存策略
    .apply(RequestOptions.circleCropTransform()) // 请求配置 圆形
    .into(imageView)
}

/**
 * 对 TextView 时间部分 进行格式化 -- yyyy-MM-dd:HH:mm
 * 自定义属性 -- formatTime ,xml 中 直接绑定
 */
@BindingAdapter("android:formatTime", requireAll = false)
fun tvFormatTime(tv: TextView, time: Any) {
  val format = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CHINA)
  tv.text = format.format(time)
}

/**
 * 对 TextView 作者 进行格式化 -- 作者：xxx
 * 自定义属性 -- formatAuthor ,xml 中 直接绑定
 */
@BindingAdapter("android:formatAuthor", requireAll = false)
fun tvFormatAuthor(tv: TextView, author: String?) {
  val name = if (author.isNullOrEmpty()) "匿名" else author
  // 通过 string 资源文件获取
  val authorName = String.format(tv.context.getString(R.string.author_name), name)
  tv.text = authorName
}

/**
 * 对 TextView 设置背景颜色
 * 自定义属性 -- setBgColor ,xml 中 直接绑定
 * @param tv TextView
 * @param Selected Boolean?          -- 是否选中
 * @param position Int?              -- 当前位置
 * @param selectedPosition Int?      -- 选中位置
 */
@BindingAdapter("android:setBgColor", "android:setPosition", "android:setSelectedPosition")
fun tvSetBgColor(tv: TextView, Selected: Boolean?, position: Int?, selectedPosition: Int?) {
  if (Selected == true) {
    tv.background = getBgDrawable(tv.context, R.color.white)
    // 选中时加粗
    tv.typeface = Typeface.DEFAULT_BOLD
  } else {
    when (position) {
      // 前一个Item背景 右下角圆角
      selectedPosition!! - 1 -> {
        tv.background =
          getBgDrawable(tv.context, color = R.color.color_f0f2f4, bottomRightRadius = mRadius)
      }
      // 后一个Item背景 右上角圆角
      selectedPosition + 1 -> {
        tv.background =
          getBgDrawable(tv.context, color = R.color.color_f0f2f4, topRightRadius = mRadius)
      }
      else -> { // 取消圆角
        tv.background = getBgDrawable(tv.context, color = R.color.color_f0f2f4)
      }
    }
    // 不加粗
    tv.typeface = Typeface.DEFAULT
  }
}

/**
 * 背景圆角
 */
private val mRadius = ConvertUtils.dp2px(8.0F).toFloat()

/**
 * 设置背景
 * @param color 背景颜色
 * @param topLeftRadius top-left
 * @param topRightRadius top-right
 * @param bottomRightRadius bottom-left
 * @param bottomLeftRadius bottom-right
 */
private fun getBgDrawable(
  context: Context,
  @ColorRes color: Int,
  topLeftRadius: Float = 0.0f,
  topRightRadius: Float = 0.0f,
  bottomRightRadius: Float = 0.0f,
  bottomLeftRadius: Float = 0.0f,
): GradientDrawable {
  return GradientDrawable().apply {
    setColor(ContextCompat.getColor(context, color))
    shape = GradientDrawable.RECTANGLE
    cornerRadii = floatArrayOf(
      topLeftRadius,
      topLeftRadius,
      topRightRadius,
      topRightRadius,
      bottomRightRadius,
      bottomRightRadius,
      bottomLeftRadius,
      bottomLeftRadius
    )
  }
}

/**
 * 修改图片颜色 -- setColorFilter
 * 图片资源支持 tint 颜色修改，支持colorRes和colorInt形式   R.color.primary   Color.RED
 */
@BindingAdapter("app:tint")
fun imgColor(imageView: ImageView, color: Int) {
  if (color == 0) return
  runCatching {
//    imageView.setColorFilter(imageView.resources.getColor(color))
    imageView.setColorFilter(ContextCompat.getColor(imageView.context, color))
  }.onFailure {// 捕获异常，说明此时是Color.RED形式 colorInt
    imageView.setColorFilter(color)
  }
}

/**
 * 修改字体颜色  原生
 * textColor的binding形式，支持colorRes和colorInt形式
 */
@BindingAdapter("android:textColor")
fun tvColor(tv: TextView, color: Int) {
  if (color == 0) return
  runCatching {
    // 如果是colorInt形式，会报错
    tv.setTextColor(ContextCompat.getColor(tv.context, color))
  }.onFailure {// 捕获异常，说明此时是Color.RED形式
    tv.setTextColor(color)
  }
}

/*
* 进度条，NumberProgressBar的扩展函数 将传来的progress*100转化为百分比形式 并且支持dataBinding加载
*  NumberProgressBar 是自定义组件
* */

/*
@BindingAdapter("app:progress_current", requireAll = false)
fun setProgress(pb: NumberProgressBar, progress: Double?) {
  pb.progress = (progress ?: 0.0).toInt() // *100，转化为百分比显示
}
*/
